{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:14:46.350753Z",
     "start_time": "2025-06-26T06:14:46.346738Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "['c:\\\\Program Files\\\\Python312\\\\python312.zip', 'c:\\\\Program Files\\\\Python312\\\\DLLs', 'c:\\\\Program Files\\\\Python312\\\\Lib', 'c:\\\\Program Files\\\\Python312', '', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\win32', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\win32\\\\lib', 'C:\\\\Users\\\\41507\\\\AppData\\\\Roaming\\\\Python\\\\Python312\\\\site-packages\\\\Pythonwin', 'c:\\\\Program Files\\\\Python312\\\\Lib\\\\site-packages']\n"
     ]
    }
   ],
   "source": [
    "import sys\n",
    "print(sys.path)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:14:48.340332Z",
     "start_time": "2025-06-26T06:14:46.350753Z"
    }
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.datasets import fetch_california_housing\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "import torch\n",
    "import torch.nn as nn\n",
    "from tqdm.auto import tqdm\n",
    "from torch.utils.data import DataLoader, Dataset\n",
    "from deeplearning_func import EarlyStopping, ModelSaver\n",
    "from deeplearning_func import plot_learning_loss_curves,train_multi_output_regression_model,evaluate_multi_output_regression_model\n",
    "import os"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:14:48.358208Z",
     "start_time": "2025-06-26T06:14:48.340332Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集大小: 13209\n",
      "验证集大小: 3303\n",
      "测试集大小: 4128\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "# 加载加利福尼亚房价数据集\n",
    "housing = fetch_california_housing()\n",
    "X = housing.data\n",
    "y = housing.target\n",
    "\n",
    "# 数据拆分：训练集(60%)、验证集(20%)、测试集(20%)\n",
    "X_train_val, X_test, y_train_val, y_test = train_test_split(X, y, test_size=0.2, random_state=42)\n",
    "X_train, X_val, y_train, y_val = train_test_split(X_train_val, y_train_val, test_size=0.2, random_state=42)  # 0.25 x 0.8 = 0.2\n",
    "\n",
    "print(f\"训练集大小: {X_train.shape[0]}\")\n",
    "print(f\"验证集大小: {X_val.shape[0]}\")\n",
    "print(f\"测试集大小: {X_test.shape[0]}\")\n",
    "\n",
    "# 数据标准化\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_val_scaled = scaler.transform(X_val)\n",
    "X_test_scaled = scaler.transform(X_test)\n",
    "\n",
    "# 自定义数据集类\n",
    "class HousingDataset(Dataset):\n",
    "    def __init__(self, features, targets):\n",
    "        self.features = torch.FloatTensor(features)\n",
    "        self.targets = torch.FloatTensor(targets).view(-1, 1)\n",
    "        \n",
    "    def __len__(self):\n",
    "        return len(self.features) #返回样本数量\n",
    "    \n",
    "    def __getitem__(self, idx): #传入索引，返回对应索引样本的特征和目标\n",
    "        return self.features[idx], self.targets[idx]\n",
    "\n",
    "# 创建数据集实例\n",
    "train_dataset = HousingDataset(X_train_scaled, y_train)\n",
    "val_dataset = HousingDataset(X_val_scaled, y_val)\n",
    "test_dataset = HousingDataset(X_test_scaled, y_test)\n",
    "\n",
    "# 创建数据加载器\n",
    "train_loader = DataLoader(train_dataset, batch_size=32, shuffle=True)\n",
    "val_loader = DataLoader(val_dataset, batch_size=32)\n",
    "test_loader = DataLoader(test_dataset, batch_size=32)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 加载数据，构建模型,多输出模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:14:49.085821Z",
     "start_time": "2025-06-26T06:14:48.358208Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WideDeepModel(\n",
      "  (deep): Sequential(\n",
      "    (0): Linear(in_features=8, out_features=30, bias=True)\n",
      "    (1): ReLU()\n",
      "    (2): Linear(in_features=30, out_features=30, bias=True)\n",
      "    (3): ReLU()\n",
      "  )\n",
      "  (output): Linear(in_features=38, out_features=1, bias=True)\n",
      ")\n"
     ]
    }
   ],
   "source": [
    "from torch import optim\n",
    "\n",
    "\n",
    "\n",
    "# 定义神经网络模型\n",
    "class WideDeepModel(nn.Module):\n",
    "    def __init__(self, input_dim):\n",
    "        super().__init__()\n",
    "        # Deep部分使用Sequential\n",
    "        self.deep = nn.Sequential(\n",
    "            nn.Linear(input_dim, 30),\n",
    "            nn.ReLU(),\n",
    "            nn.Linear(30, 30),\n",
    "            nn.ReLU()\n",
    "        )\n",
    "        \n",
    "        # Wide部分直接使用原始输入\n",
    "        \n",
    "        # 输出层，输入维度是deep部分的30 + wide部分的input_dim\n",
    "        self.output = nn.Linear(30 + input_dim, 1)\n",
    "        \n",
    "    def forward(self, x):\n",
    "        # Deep路径，deep shape是[batch_size, 30]\n",
    "        deep = self.deep(x)\n",
    "        \n",
    "        # Wide路径直接使用原始输入\n",
    "        wide = x\n",
    "        \n",
    "        # 连接Wide和Deep,combined shape是[batch_size, 30 + input_dim]\n",
    "        combined = torch.cat([wide, deep], dim=1)\n",
    "        \n",
    "        # 输出层，输出shape是[batch_size, 1]\n",
    "        output = self.output(combined)\n",
    "        return output,deep\n",
    "\n",
    "# 初始化模型、损失函数和优化器\n",
    "input_dim = X_train.shape[1]\n",
    "model = WideDeepModel(input_dim)\n",
    "criterion = nn.MSELoss()\n",
    "optimizer = optim.Adam(model.parameters())\n",
    "\n",
    "# 打印模型结构\n",
    "print(model)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:15:20.191876Z",
     "start_time": "2025-06-26T06:14:49.089839Z"
    }
   },
   "outputs": [
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "4caa78f330954559b5bdc1bc5b58f4ed",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "train progress:   0%|          | 0/41300 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "早停触发! 最佳验证准确率(如果是回归，这里是损失): -0.6474\n",
      "早停: 已有10轮验证损失没有改善！\n"
     ]
    }
   ],
   "source": [
    "\n",
    "\n",
    "\n",
    "# 训练模型\n",
    "# 初始化早停和模型保存对象\n",
    "early_stopping = EarlyStopping(patience=10, verbose=True)\n",
    "model_saver = ModelSaver(save_dir='model_weights')\n",
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "model, record_dict = train_multi_output_regression_model(\n",
    "    model=model,\n",
    "    train_loader=train_loader,\n",
    "    val_loader=val_loader,\n",
    "    criterion=criterion,\n",
    "    optimizer=optimizer,\n",
    "    num_epochs=100,\n",
    "    print_every=10,\n",
    "    eval_step=500,\n",
    "    early_stopping=early_stopping,\n",
    "    model_saver=model_saver,\n",
    "    device=device\n",
    ")\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:15:20.355745Z",
     "start_time": "2025-06-26T06:15:20.192889Z"
    }
   },
   "outputs": [
    {
     "data": {
      "image/png": "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0jI3zaRomZiu85PfHB9tTKDBhXZe00BI59Z06tTJb9vZqVMn+f777+W7774z3ey03E2bN2h2SlWsWNEEaeedd54Jbt5//31TGqcttXUe0l9//WW622nm6IknnjDttS+44AKfbjOZIG+Xw2UQBAEAAKDkNCjQrIonK7DInTGySsssw4cPz/G1VR5nZYiysrIkNDRnPkTn6BRG7969T2lhfcUVV5hLXs466yyZMWNGnt/ToOiPP/4QfyMT5CWUwwEAAAClA0GQ18vhCp68BgAAANjVHXfcYeYg5XXR75UFlMN5SWS4s/MFc4IAAABQmj377LNmPlJedA5PWUAQ5CUslgoAAICyoFq1auZSllEO5+VyOIIgAAAAwN4IgryExVIBAACA0oEgyEsIggAAAIDSgSDISyLDKIcDAAAASgOCIC8hEwQAAACUDgRBXhIVQRAEAAAA+2jQoIGMGjWqUD8bEhIi48aNk2BBEOQlUa51gtKzCIIAAAAAOyMI8pLIsBD3nCCHwxHozQEAAACQD4IgL4l0ZYIUJXEAAAA2pgPW6cn+vxRhoPzDDz+UWrVqSXZ2zvPKQYMGyc033yybN282t6tXry7ly5eXrl27ypQpU7z2FK1cuVLOO+88iYmJkcqVK8vtt98ux48fd39/xowZ0q1bNylXrpxUrFhRevbsKdu2bTPfW758uZx77rkSFxcn8fHx0rlzZ1m0aJHYSXigN6CsNUawSuKiI04GRQAAALCRjBSRF2v5/+8+vlskslyhfvSqq66Se+65R6ZPny59+vQx9x0+fFj++OMP+f33301AMnDgQHnhhRckKipKvvjiC7n44otl/fr1Uq9evRJtZnJysgwYMEC6d+8uCxculP3798utt94qd999t4wePVoyMzPl0ksvldtuu02+/fZbSU9PlwULFph5RWro0KHSsWNHee+99yQsLEyWLVsmERERYicEQV4S4SqHU2kZ2SLRAd0cAAAAlGKVKlWSCy64QL755ht3EPTjjz9KlSpVTJYlNDRU2rdv7/755557TsaOHSu//vqrCVZK4ptvvpHU1FQTWGmmR7399tsmyHrllVdMQJOYmCgXXXSRNG7c2Hy/ZcuW7v+/fft2efjhh6VFixbm66ZNm4rdEAR5iUa+ESEOyXCESFpmVqA3BwAAAPmJiHVmZQLxd4tAMyqabXn33XdNtufr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PBk0aJCsXr3afJ/3gj32g+K94EFbZKNounXr5hg+fLj766ysLEetWrUcL730kvlan9axY8e6v//UU085atSo4Vi+fHlAtrcsevrppx3t27fP9/vsA9/L/RxnZ2eb5/g///mP+76jR486oqKiHN9++635esuWLeb/LV261HydmZnpuOmmmxzNmzd3bNu2LQCPouztBzVs2DDHoEGD8v0/7Afv279/v3lOZ86c6X7tR0REOH744Qf3z6xdu9b8zNy5c83X06dPN18fOXLEfJ2cnOw4//zzHT169HDfh5LtB3XOOec47rvvvnz/D/vBNypVquT4+OOPeS/YZD8o3gs5kQkqovT0dBNha5mPJTQ01Hw9d+7cHD+r5yf33HOPfPHFF/L333+bFCW8R8ustByoUaNGMnToUNm+ffspP8M+8J8tW7bI3r17c7w3KlSoYMpFc783VFpamlx11VVmXorum3r16vl5i8t+bbeWBzVv3lzuvPNOOXToUJ4/x37wjsTERHOdkJBgrvVzQrMSnu8HLdnV5zev94PW4Pfr10+ys7NNRqNixYp+3Pqyux8sX3/9tVSpUkXatGkjjz32mKSkpOT5/9kPJZeVlSXfffedycZpORbvBXvsBwvvhZPCPW6jEA4ePGheWNWrV89xv369bt0699eZmZly3XXXydKlS02ZVu3atQOwtWWXnliPHj3anOBpOnfkyJFy9tlny6pVq0xtuGIf+JcGQCqv94b1Pcvx48flwgsvNCfg06dPN8ESvEdL4bTUpGHDhrJ582Z5/PHH5YILLjAnHGFhYe6fYz94h54k3H///dKzZ09zYqH0NR8ZGXnKiUNe7wf9evDgwdK0aVP55ptvzP+Dd/aDGjJkiNSvX98Mmq1YsUIeeeQRM2/o559/zvH/2Q8ls3LlSnOyreXPOu9n7Nix0qpVKzPAwnsh8PtB8V7IiSDIR7T+NSoqytQpa8QN79ITOotmdzQo0jf2999/L7fccou5n31gX9dee62pXZ42bZppoADvuuaaa9y327Zta94jjRs3NtmhPn36uL/HfvAOnZOiAzDFnZeoo63dunUz8009g1R4Zz/cfvvtOd4P2rhF3wc6QKDvCwv7oWR0UFIDHs3G/fjjjzJs2DAz/6co2Ae+2w8aCPFeyIlyuCLSk2l9QeTuaqJf16hRI8cLaNeuXfLnn38GYCuDj44wNWvWTDZt2uS+j33gX9brv6D3hho4cKAZhcqrFALepyWjeuzyfH8o9kPJ3X333TJ+/HiTSdOA0qKveS2fzt1qNq/3g2bjtOPfmjVr/LbdwbIf8qKDZir3+4H9UDKaLWjSpIl07tzZdO3T5i1vvPEG7wWb7Ie8nBHk7wWCoGK8uPSFNXXq1BwpeP3as+bykksuMSnEW2+91dRkwre0rEdHMnRUw8I+8C8tvdIPNM/3RlJSkukS5/neUDpHRTvY6D4q6kghim7nzp1mTpDn+0OxH4pP5xvqibeWmmgmTV//nvRzIiIiIsf7QctOdO5i7veD7gMdrdUR2bJ+0uHv/ZAXa32s3O8H9oN36bmRltryXrDHfsjLsmB/L+RqlIBC+O6770zHq9GjRzvWrFnjuP322x0VK1Z07N2795RuTdoNJTo6OkdXFJTcgw8+6JgxY4bpcjV79mxH3759HVWqVDGdgRT7wDeOHTtmOorpRZ/j119/3dy2Ooq9/PLL5r3wyy+/OFasWGE6lDVs2NBx4sSJPLuS/e9//3OUL1/e8ffffwf0cZWl/aDfe+ihh0zXJX2+p0yZ4ujUqZOjadOmjtTUVPP/2Q8ld+eddzoqVKhgjkN79uxxX1JSUtw/c8cddzjq1avnmDZtmmPRokWO7t27m0t+nZjuv/9+R/Xq1U3nLHhnP2zatMnx7LPPmudfX/d6bGrUqJGjV69e7t/Bfii5Rx991HTk0+dYj/36dUhIiGPSpEnm+7wXAr8feC+ciiComN566y3zho6MjDQts+fNm5dvy9oxY8aYk/CffvopQFtb9gwePNhRs2ZN8/zXrl3bfK1vcAv7wDesA2Tui7ZkttpkP/nkk+agqQMFffr0caxfv979/3OffKvXXnvNERcXZ4JZlHw/6Mlf//79HVWrVjVtaevXr++47bbb3IM0iv1Qcnk9/3r57LPP3D+jwf9dd91lWtTGxsY6LrvsMnOCnt8Jh7rnnnvMsc3zfYPi74ft27ebk7yEhARzTGrSpInj4YcfdiQmJrp/B/uh5G6++WZzrNHPZD326LHfCoAU74XA7wfeC6cK0X8CnY0CAAAAAH9hThAAAACAoEIQBAAAACCoEAQBAAAACCoEQQAAAACCCkEQAAAAgKBCEAQAAAAgqBAEAQAAAAgqBEEAAAAAggpBEAAAAICgQhAEACgVbrzxRrn00ksDvRkAgDKAIAgAAABAUCEIAgDYyo8//iht27aVmJgYqVy5svTt21cefvhh+fzzz+WXX36RkJAQc5kxY4b5+R07dsjVV18tFStWlISEBBk0aJBs3br1lAzSyJEjpWrVqhIfHy933HGHpKenB/BRAgACKTygfx0AAA979uyRa6+9Vl599VW57LLL5NixY/L333/LDTfcINu3b5ekpCT57LPPzM9qwJORkSEDBgyQ7t27m58LDw+X559/Xs4//3xZsWKFREZGmp+dOnWqREdHm8BJA6SbbrrJBFgvvPBCgB8xACAQCIIAALYKgjIzM+Xyyy+X+vXrm/s0K6Q0M5SWliY1atRw//xXX30l2dnZ8vHHH5vskNIgSbNCGvD079/f3KfB0KeffiqxsbHSunVrefbZZ0126bnnnpPQUIoiACDYcOQHANhG+/btpU+fPibwueqqq+Sjjz6SI0eO5Pvzy5cvl02bNklcXJyUL1/eXDRDlJqaKps3b87xezUAsmjm6Pjx46aUDgAQfMgEAQBsIywsTCZPnixz5syRSZMmyVtvvSX//ve/Zf78+Xn+vAYynTt3lq+//vqU7+n8HwAA8kIQBACwFS1r69mzp7k89dRTpixu7NixpqQtKysrx8926tRJxowZI9WqVTMND06XMTpx4oQpqVPz5s0zWaO6dev6/PEAAOyHcjgAgG1oxufFF1+URYsWmUYIP//8sxw4cEBatmwpDRo0MM0O1q9fLwcPHjRNEYYOHSpVqlQxHeG0McKWLVvMXKB7771Xdu7c6f692gnulltukTVr1sjvv/8uTz/9tNx9993MBwKAIEUmCABgG5rN+euvv2TUqFGmE5xmgV577TW54IILpEuXLibA0Wstg5s+fbr07t3b/PwjjzximiloN7natWubeUWemSH9umnTptKrVy/TXEE70D3zzDMBfawAgMAJcTgcjgD+fQAAfErXCTp69KiMGzcu0JsCALAJ6gAAAAAABBWCIAAAAABBhXI4AAAAAEGFTBAAAACAoEIQBAAAACCoEAQBAAAACCoEQQAAAACCCkEQAAAAgKBCEAQAAAAgqBAEAQAAAAgqBEEAAAAAJJj8P9li2AO0tR6kAAAAAElFTkSuQmCC",
      "text/plain": [
       "<Figure size 1000x500 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#画图\n",
    "plot_learning_loss_curves(record_dict,sample_step=500)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-06-26T06:15:20.412545Z",
     "start_time": "2025-06-26T06:15:20.356836Z"
    }
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "测试集上的损失为0.6410\n"
     ]
    }
   ],
   "source": [
    "device = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")\n",
    "test_loss=evaluate_multi_output_regression_model(model,test_loader,device,criterion)\n",
    "print(f\"测试集上的损失为{test_loss:.4f}\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.12.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
